-
Notifications
You must be signed in to change notification settings - Fork 183
Add reference for 'nonisolated' [SE-0449] #369
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
XXX TR: Are there any declarations you can't mark nonisolated? | ||
The SE proposal says "all type and protocol declarations". | ||
It seems like "nonisolated actor" wouldn't make sense, for example, | ||
but this compiles: nonisolated actor A { } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That seems like a bug.
"on any actor" vs "on the shared thread pool"? | ||
Or would this be clearer as explained in contrast to "isolation", | ||
as defined in the new section in the Concurrency chapter? | ||
--> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Suggestion:
Apply this modifier to a declaration to suppress any implicit
isolation that would ordinarily apply to it. For example, a
nonisolated
property of an actor is not isolated to
self
, and anonisolated
method of a@MainActor
class is not isolated to the main actor.A
nonisolated
method or property is just like any other
function or variable that is not isolated to an actor. For
example, you can call a non-isolated synchronous method
of an actor from outside the actor without marking the call
withawait
. In turn, the body of the method or property is
treated as if it were outside the actor for isolation purposes.
For example, if you call an isolated method from a non-isolated
method, you must mark the call withawait
.
Maybe add an example showing this. Then I think we continue with the discussion of nonisolated
types and extensions.
I'm not sure the above is correct. | ||
Does this also apply to nonsendable variables? | ||
Any context where you'd be overriding an inferred isolation? | ||
--> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This doesn't seem right. I think this might be backwards — you've got it right below with "Sendable
variables and properties".
class MyClass { | ||
nonisolated var x: NonSendable = NonSendable() | ||
} | ||
--> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Suggestion:
Swift restricts non-isolated stored variables so that they can provide
data isolation without using an actor. Non-isolated global
variables, static properties, and instance properties of actors and
sendable classes must belet
constants of a sendable type.
Non-isolated instance properties of sendablestruct
s must
have a sendable type, but they are allowed to be mutable.If a stored variable meets the conditions for being nonisolated,
Swift will allow it to be used as if it were markednonisolated
within the module that defines it. To use it asnonisolated
outside of that module, you must mark itnonisolated
explicitly.You can bypass these restrictions by marking a stored variable
nonisolated(unsafe)
. You are then responsible for ensuring
that the variable is only accessed in correctly-ordered ways.
This may be appropriate if, for example, you are protecting the
variable with a mutex and cannot use Swift'sMutex
type.
Fixes: rdar://144571564